package com.hsnn.medstgmini.sys.information.service;

import java.io.File;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.transaction.Transactional;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import com.hsnn.medstgmini.model.MessageType;
import com.hsnn.medstgmini.pro.base.model.form.FileUploadResult;
import com.hsnn.medstgmini.sys.information.dao.SysMessageDao;
import com.hsnn.medstgmini.sys.information.model.SysInfoAttachment;
import com.hsnn.medstgmini.sys.information.model.SysMessage;
import com.hsnn.medstgmini.sys.information.model.SysMessageRecp;
import com.hsnn.medstgmini.sys.information.service.impl.SysMessageManager;
import com.hsnn.medstgmini.sys.model.UserType;
import com.hsnn.medstgmini.util.ImgUtil;
import com.hsnn.medstgmini.util.Pagination;
import com.hsnn.medstgmini.util.ParseDate;

@Service
public class SysMessageManagerImpl implements SysMessageManager {
	private static final Logger logger = LoggerFactory
			.getLogger(SysMessageManagerImpl.class);
	@Autowired
	private SysMessageDao sysMessageDao;

	@Value("#{sysProp['system.uploadPath']}")
	private String uploadPath;// 文件保存路径
	@Value("#{sysProp['system.importMessagePath']}")
	private String importMessagePath;//
	@Value("#{sysProp['system.importMessageResultPath']}")
	private String importMessageResultPath;

	/**
	 * @category 新建消息
	 * @author 韩守松
	 * @date 2015年11月9日
	 * @param @param sysMessage
	 */
	@Transactional
	public void saveOrUpDate(SysMessage sysMessage) {
		sysMessageDao.saveOrUpDate(sysMessage);
	}

	/**
	 * @category 获取草稿箱消息
	 * @author 韩守松
	 * @date 2015年11月9日
	 * @param @param sysMessage
	 * @param @return
	 */
	public Pagination getSysMessageList(Pagination page, SysMessage sysMessage) {
		return sysMessageDao.getSysMessageList(page, sysMessage);
		
	}

	/**
	 * @category 获取发件箱消息
	 * @author 韩守松
	 * @date 2015年11月9日
	 * @param @param sysMessage
	 * @param @return
	 */
	public Pagination getSysMessageSendList(Pagination page,
			SysMessage sysMessage) {
		return sysMessageDao.getSysMessageSendList(page, sysMessage);
	}

	/**
	 * @category 获取收件箱消息
	 * @author 韩守松
	 * @date 2015年11月9日
	 * @param @param sysMessage
	 * @param @return
	 */
	public Pagination getSysMessageReceList(Pagination page,
			SysMessage sysMessage) {
		return  sysMessageDao.getSysMessageReceList(page, sysMessage);
	}

	/**
	 * @category 根据消息id获取消息信息
	 * @author 韩守松
	 * @date 2015年11月10日
	 * @param @param messageId
	 * @param @return
	 */
	@SuppressWarnings("unchecked")
	public Map<String, Object> getSysMessageById(String messageId) {
		List<SysMessage> listMessage = sysMessageDao
				.getSysMessageById(messageId);
		List<SysMessageRecp> listMessageRecp = sysMessageDao
				.getAllReceUserById(messageId);
		List<SysInfoAttachment> listInfoAttachment = sysMessageDao
				.getAllUrlsById(messageId);
		Map<String, Object> map = new HashMap<String, Object>();
		Map<String, Object> mapRecep = new HashMap<String, Object>();
		Map<String, Object> mapAttachment = new HashMap<String, Object>();
		if (listMessage.size() > 0) {
			map = (Map<String, Object>) listMessage.get(0);
			map.put("acctType", UserType.getName(Integer.valueOf(map.get("acctType").toString())));
			map.put("type", MessageType.getName(Integer.valueOf(map.get("type").toString())));
			map.put("updDatetime",map.get("updDatetime").toString().substring(0, map.get("updDatetime").toString().length()-2) );
		}
		String sysInfoAttachIds = "";
		String urlsStr = "";
		String fileName = "";
		String receUserId = "";
		String receName = "";
		String typeStr = "";
		String recOrgName = "";
		String recOrgId = "";
		if (listMessageRecp.size() > 0) {
			for (int i = 0; i < listMessageRecp.size(); i++) {
				mapRecep = (Map<String, Object>) listMessageRecp.get(i);
				receUserId += mapRecep.get("receUser") + ",";
				receName += mapRecep.get("receName") + ",";
				typeStr += mapRecep.get("receType") + ",";
				recOrgName += mapRecep.get("recOrgName") + ",";
				recOrgId += mapRecep.get("recOrgId") + ",";
			}
		}

		if (listInfoAttachment.size() > 0) {
			for (int i = 0; i < listInfoAttachment.size(); i++) {
				mapAttachment = (Map<String, Object>) listInfoAttachment.get(i);
				urlsStr += mapAttachment.get("url") + ",";
				fileName += mapAttachment.get("fileName")+",";
				sysInfoAttachIds += mapAttachment.get("sysInfoAttachId")+",";
				
			}
		}
		if (StringUtils.isNotBlank(receUserId)) {
			map.put("receUser",
					receUserId.substring(0, receUserId.length() - 1));
		}
		if (StringUtils.isNotBlank(receName)) {
			map.put("receUserName",
					receName.substring(0, receName.length() - 1));
		}
		if (StringUtils.isNotBlank(typeStr)) {
			map.put("receType", typeStr.substring(0, typeStr.length() - 1));
		}
		if (StringUtils.isNotBlank(recOrgName)) {
			map.put("recOrgName",
					recOrgName.substring(0, recOrgName.length() - 1));
		}
		if (StringUtils.isNotBlank(recOrgId)) {
			map.put("recOrgId", recOrgId.substring(0, recOrgId.length() - 1));
		}
		if (StringUtils.isNotBlank(urlsStr) && StringUtils.isNotBlank(fileName)) {
			map.put("url", urlsStr);
			map.put("fileName", fileName);
			map.put("sysInfoAttachId", sysInfoAttachIds);
		}
		return map;
	}

	/**
	 * @category 根据消息id修改消息状态
	 * @author 韩守松
	 * @date 2015年11月11日
	 * @param @param sysMessage
	 */
	public void update(SysMessage sysMessage) {
		sysMessageDao.update(sysMessage);
	}

	/**
	 * @category 根据消息id修改消息阅读状态
	 * @author 韩守松
	 * @date 2015年11月11日
	 * @param @param sysMessage
	 */
	public void updateReadStatus(SysMessage sysMessage) {
		sysMessageDao.updateReadStatus(sysMessage);
	}

	/**
	 * 
	 * @category 上传附件导入文件
	 * @author 韩守松
	 * @date 2015年11月15日
	 * @param
	 */
	@Transactional
	public FileUploadResult uploadFile(MultipartFile profile) {
		String fileRealname = profile.getOriginalFilename();
		FileUploadResult result = new FileUploadResult();
		if (profile.getSize() > 3 * 1024 * 1024) {
			result.setResult("文件不能大于3M！");
			return result;
		}
		String[] suffixNewList = {".gif", ".jpg", ".png", ".jpeg",".bmp",".txt",".doc",".pdf",".xlsx"};
		if (!ImgUtil.isImg(fileRealname,suffixNewList)) {
			String msg = "请选择以下图片格式：gif, jpg, jpeg, png, bmp,txt,doc,pdf,xlsx！";
			result.setResult(msg);
			return result;
		}
		result.setFileName(fileRealname);
		String fileUploadname = String.valueOf(ParseDate
				.parseWithNum(new Date()))
				+ fileRealname.substring(fileRealname.lastIndexOf("."),
						fileRealname.length());
		try {
			FileUtils.copyInputStreamToFile(profile.getInputStream(), new File(
					uploadPath + importMessagePath, fileUploadname));

		} catch (Exception e) {
			logger.error("文件上传失败：", e);
			result.setResult("文件上传失败！");
			return result;
		}
		File file = new File(uploadPath + importMessageResultPath);
		if (!file.exists()) {
			try {
				file.mkdirs();
			} catch (Exception e) {
				logger.error("创建导入结果文件夹失败", e);
				result.setResult("创建导入结果文件夹失败!");
				return result;
			}
		}
		result.setFileId(UUID.randomUUID().toString());
		result.setResult("上传成功");
		result.setPath(uploadPath + importMessagePath + fileUploadname);
		return result;
	}

	/**
	 * @category 获取系统消息
	 * @author 韩守松
	 * @date 2015年11月16日
	 * @param @param page
	 * @param @param sysMessage
	 * @param @return
	 */
	public List<SysMessage> getSysMessageListByType(Pagination page,
			SysMessage sysMessage) {
		return sysMessageDao.getSysMessageListByType(page, sysMessage);
	}
	
	/**
	 * @category 更新附件下载次数
	 * @author 韩守松
	 * @date   2015年11月17日
	 * @param  @param sysInfoAttachId
	 */
	@Transactional
	public void updateDownSum(String sysInfoAttachId,String userId){
		sysMessageDao.updateDownSum(sysInfoAttachId,userId);
	}
}
